home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtrsc.org < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  10.0 KB  |  340 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtRsc;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *  3.01     | 21.01.92 |  Hp  | RelocRsc gefixt.                       *
  29.  *  3.02     | 03.02.92 |  Hp  | Routinen optimiert                     *
  30.  *----------------------------------------------------------------------*)
  31.  
  32.  
  33.  
  34. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  35. (*                                              *)
  36. (*$R-   Range-Checks                            *)
  37. (*$S-   Stack-Check                             *)
  38. (*                                              *)
  39. (*----------------------------------------------*)
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  49.  
  50.  
  51.  
  52.  
  53. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  54.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  55.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  56.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  57.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  58.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  59.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  60.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67. FROM SYSTEM             IMPORT  ADDRESS, TSIZE;
  68. FROM MagicAES           IMPORT  AESPB, RsrcLoad, RsrcFree, RsrcGaddr, RsrcSaddr,
  69.                                 RsrcObfix, ShelFind, GBOX, GTEXT, GBOXTEXT, 
  70.                                 GIMAGE, GPROGDEF, GIBOX, GBUTTON, GBOXCHAR,
  71.                                 GSTRING, GFTEXT, GFBOXTEXT, GICON, GTITLE;
  72. FROM MagicStrings       IMPORT  Assign;
  73. FROM mtAppl             IMPORT  InstallTermproc, MouseOn, MouseOff, MouseBusy,
  74.                                 MouseArrow, StoreMouse, RestoreMouse;
  75.  
  76.                         IMPORT  MagicAES, MagicTypes, mtUtils;
  77.  
  78. CONST   cRel = 0;
  79.  
  80.  
  81. TYPE    RESOURCE =      POINTER TO Resource;
  82.         Resource =      RECORD
  83.                          addr:  ADDRESS;
  84.                          flags: sBITSET;
  85.                          next:  RESOURCE;
  86.                          last:  RESOURCE;
  87.                         END;
  88.  
  89. VAR     RscList:        RESOURCE;
  90.  
  91.  
  92. PROCEDURE NewRsc (rtree: ADDRESS; mode: sBITSET): RESOURCE;
  93. VAR p, q: RESOURCE;
  94. BEGIN
  95.  IF RscList = NIL THEN
  96.   ALLOCATE (RscList, TSIZE(Resource));
  97.   IF RscList # NIL THEN
  98.    RscList^.addr:= rtree;
  99.    RscList^.flags:= mode;
  100.    RscList^.next:= NIL;
  101.    RscList^.last:= NIL;
  102.   END;
  103.   RETURN RscList;
  104.  ELSE
  105.   p:= RscList;
  106.   WHILE p^.next # NIL DO  p:= p^.next;  END;
  107.   ALLOCATE (q, TSIZE(Resource));
  108.   IF q # NIL THEN
  109.    q^.addr:= rtree;
  110.    q^.flags:= mode;
  111.    q^.last:= p;
  112.    q^.next:= NIL;
  113.    p^.next:= q;
  114.   END; 
  115.   RETURN q;
  116.  END;
  117. END NewRsc;
  118.  
  119. PROCEDURE LoadRsc (REF name: ARRAY OF CHAR; VAR rsc: RESOURCE): BOOLEAN;
  120. VAR path: ARRAY [0..255] OF CHAR;
  121.     load: BOOLEAN;
  122.     adr:  ADDRESS;
  123. BEGIN
  124.  StoreMouse;  MouseBusy;
  125.  Assign (name, path);
  126.  ShelFind (path); 
  127.  adr:= AESPB.cbPglobal^.apPtree;
  128.  AESPB.cbPglobal^.apPtree:= Null;
  129.  load:= RsrcLoad (path);
  130.  RestoreMouse;
  131.  IF load = FALSE THEN
  132.   AESPB.cbPglobal^.apPtree:= adr;  rsc:= NIL;  RETURN FALSE;
  133.  END;
  134.  rsc:= NewRsc (AESPB.cbPglobal^.apPtree, {});
  135.  RETURN rsc # NIL;
  136. END LoadRsc;
  137.  
  138. PROCEDURE RelocRsc (address: ADDRESS; VAR rsc: RESOURCE): BOOLEAN;
  139. CONST MaxObject = MAX (sINTEGER);
  140. VAR   rshdr:    POINTER TO MagicTypes.RSHDR;
  141.       base:     mtUtils.tObjcTree;
  142.       tree:     POINTER TO ARRAY [0..MaxObject] OF mtUtils.tObjcTree;
  143.       string:   POINTER TO ARRAY [0..MaxObject] OF MagicAES.PtrSTRING;
  144.       fimage:   POINTER TO ARRAY [0..MaxObject] OF ADDRESS;
  145.       ted:      POINTER TO ARRAY [0..MaxObject] OF MagicAES.TEDINFO;
  146.       icon:     POINTER TO ARRAY [0..MaxObject] OF MagicAES.ICONBLK;
  147.       image:    POINTER TO ARRAY [0..MaxObject] OF MagicAES.BITBLK;
  148.       c, typ:   sCARDINAL;
  149.  
  150.  PROCEDURE Lowbyte (value: sINTEGER): sCARDINAL;
  151.  VAR t: RECORD
  152.          CASE x: sCARDINAL OF
  153.           0: int: sINTEGER;|
  154.           1: b2: CHAR; b1: CHAR;|
  155.          END;
  156.         END;
  157.  BEGIN
  158.   t.int:= value;  RETURN  ORD (t.b1);
  159.  END Lowbyte;
  160.  
  161. BEGIN
  162.  rshdr:= address;
  163.  WITH rshdr^ DO
  164.  
  165.   (* Trees relozieren *)
  166.   IF rshNtree > 0 THEN
  167.    tree:= address + CastToAddr (rshTrindex);
  168.    FOR c:= 0 TO rshNtree - 1 DO
  169.     tree^[c]:= address + CastToAddr (tree^[c]);
  170.    END;
  171.   END;
  172.  
  173.   (* FreeStrings relozieren *)
  174.   IF rshNstring > 0 THEN
  175.    string:= address + CastToAddr (rshString);
  176.    FOR c:= 0 TO rshNstring - 1 DO
  177.     string^[c]:= address + CastToAddr (string^[c]);
  178.    END;
  179.   END;
  180.  
  181.   (* FreeImages relozieren *)
  182.   IF rshNimages > 0 THEN
  183.    fimage:= address + CastToAddr (rshFrimg);
  184.    FOR c:= 0 TO rshNimages - 1 DO
  185.     fimage^[c]:= address + CastToAddr (fimage^[c]);
  186.    END;
  187.   END;
  188.  
  189.   (* Objcspec relozieren *)
  190.   IF rshNobs > 0 THEN
  191.    base:= address + CastToAddr (rshObject);
  192.    FOR c:= 0 TO rshNobs - 1 DO
  193.     WITH base^[c] DO
  194.      typ:= Lowbyte (obType);
  195.      IF (typ # GBOX) AND (typ # GIBOX) AND (typ # GBOXCHAR) AND
  196.         (typ # GPROGDEF) THEN
  197.       obSpec.address:= address + obSpec.address;
  198.      END; (* IF *)
  199.     END; (* WITH *)
  200.     RsrcObfix (base, c);
  201.    END; (* FOR *)
  202.   END; (* IF rshNobs *)
  203.  
  204.   (* Ted-Objects relozieren *)
  205.   IF rshNted > 0 THEN
  206.    ted:= address + CastToAddr (rshTedinfo);
  207.    FOR c:= 0 TO rshNted - 1 DO
  208.     WITH ted^[c] DO
  209.      tePtext:=  address + CastToAddr (tePtext);
  210.      tePtmplt:= address + CastToAddr (tePtmplt);
  211.      tePvalid:= address + CastToAddr (tePvalid);
  212.     END; (* WITH *)
  213.    END;
  214.   END;
  215.  
  216.   (* IconObjects relozieren *)
  217.   IF rshNib > 0 THEN
  218.    icon:= address + CastToAddr (rshIconblk);
  219.    FOR c:= 0 TO rshNib - 1 DO
  220.     WITH icon^[c] DO
  221.      ibPmask:= address + ibPmask;
  222.      ibPdata:= address + ibPdata;
  223.      ibPtext:= address + ibPtext;
  224.     END;
  225.    END;
  226.   END;
  227.  
  228.   (* ImageObjects relozieren *)
  229.   IF rshNbb > 0 THEN
  230.    image:= address + CastToAddr (rshBitblk);
  231.    FOR c:= 0 TO rshNbb - 1 DO
  232.     WITH image^[c] DO  biData:= address + biData;  END;
  233.    END;
  234.   END;
  235.  
  236.  END; (* WITH *)
  237.  
  238.  AESPB.cbPglobal^.apPtree:= tree;
  239.  rsc:= NewRsc (tree, {cRel});
  240.  RETURN rsc # NIL;
  241. END RelocRsc;
  242.  
  243. PROCEDURE FreeRsc (VAR rsc: RESOURCE);
  244. VAR old: ADDRESS;
  245. BEGIN
  246.  IF rsc # NIL THEN
  247.   old:= AESPB.cbPglobal^.apPtree;
  248.   AESPB.cbPglobal^.apPtree:= rsc^.addr;
  249.   IF NOT (cRel IN rsc^.flags) THEN  RsrcFree;  END;
  250.   IF old # rsc^.addr THEN
  251.    AESPB.cbPglobal^.apPtree:= old;
  252.   ELSE
  253.    IF rsc^.last # NIL THEN
  254.     AESPB.cbPglobal^.apPtree:= rsc^.last^.addr;
  255.    ELSIF rsc^.next # NIL THEN
  256.     AESPB.cbPglobal^.apPtree:= rsc^.next^.addr;
  257.    ELSE
  258.     AESPB.cbPglobal^.apPtree:= Null;
  259.    END;
  260.   END;
  261.   IF rsc^.last # NIL THEN
  262.    rsc^.last^.next:= rsc^.next;
  263.   ELSE
  264.    RscList:= rsc^.next;
  265.   END;
  266.   DEALLOCATE (rsc, 0);  
  267.  END;
  268. END FreeRsc;
  269.  
  270. PROCEDURE FreeAll;
  271. VAR p: RESOURCE;
  272. BEGIN
  273.  IF RscList # NIL THEN
  274.   p:= RscList;
  275.   WHILE p # NIL DO
  276.    AESPB.cbPglobal^.apPtree:= p^.addr;
  277.    IF NOT (cRel IN p^.flags) THEN  RsrcFree;  END;
  278.    p:= p^.next;
  279.   END;
  280.   AESPB.cbPglobal^.apPtree:= Null;
  281.   RscList:= NIL;
  282.  END;
  283. END FreeAll;
  284.  
  285. PROCEDURE GaddrRsc (rsc: RESOURCE; type, item: INTEGER): ADDRESS;
  286. VAR old, ret: ADDRESS;
  287. BEGIN
  288.  IF rsc # NIL THEN
  289.   old:= AESPB.cbPglobal^.apPtree;
  290.   AESPB.cbPglobal^.apPtree:= rsc^.addr;
  291.   ret:= RsrcGaddr (type, item);
  292.   AESPB.cbPglobal^.apPtree:= old;
  293.   RETURN ret;
  294.  END;
  295.  RETURN NIL;
  296. END GaddrRsc;
  297.  
  298. PROCEDURE SaddrRsc (rsc: RESOURCE; type, item: INTEGER; tree: ADDRESS);
  299. VAR old: ADDRESS;
  300. BEGIN
  301.  IF rsc # NIL THEN
  302.   old:= AESPB.cbPglobal^.apPtree;
  303.   AESPB.cbPglobal^.apPtree:= rsc^.addr;
  304.   RsrcSaddr (type, item, tree);
  305.   AESPB.cbPglobal^.apPtree:= old;
  306.  END;
  307. END SaddrRsc;
  308.  
  309. PROCEDURE ObfixRsc (rsc: RESOURCE; tree: ADDRESS; object: INTEGER);
  310. VAR old: ADDRESS;
  311. BEGIN
  312.  IF rsc # NIL THEN
  313.   old:= AESPB.cbPglobal^.apPtree;
  314.   AESPB.cbPglobal^.apPtree:= rsc^.addr;
  315.   RsrcObfix (tree, object);
  316.   AESPB.cbPglobal^.apPtree:= old;
  317.  END;
  318. END ObfixRsc;
  319.  
  320. PROCEDURE GetRscHeader (rsc: RESOURCE; VAR hdr: RSXHDR);
  321. (* Liefert den RscHeader im langen Format *)
  322. END GetRscHeader;
  323.  
  324. VAR init : sINTEGER;
  325.  
  326. PROCEDURE InitMtRsc();
  327. BEGIN
  328.  IF init # 31024
  329.  THEN
  330.    RscList:= NIL;
  331.    InstallTermproc (FreeAll);
  332.    init := 31024
  333.  END;
  334. END InitMtRsc;
  335.  
  336. BEGIN
  337.   init := 0;
  338.   InitMtRsc();
  339. END mtRsc.
  340.